#              第三节 列表与元组
# 一、列表与列表定义
grade = [90,100,89,98,99]
print('分数：',grade)
print('grade[3]=',grade[3],'grade[-2]=',grade[-2]) # grade[正向索引]=grade[-(len(g)-正向索引)]
grade2=[100,90,89]
grade3 = [grade,grade2]
print('grade3:',grade3)
# 输出结果
'''
分数： [90, 100, 89, 98, 99]
grade[3]= 98 grade[-2]= 98
grade3: [[90, 100, 89, 98, 99], [100, 90, 89]]
'''
# 列子1：根据输入的数字，输出对应的月份信息。如输入“6”，则输出“It’s June.”
months = ["January","February","March","April","May","June","July","August","September","October","November","December"]
m = eval(input('请输入月份：'))
print("It's",months[m-1])
# 输出结果：
'''
请输入月份：6
It's June
'''
# 二、操作列表元素

x = ["马云","马化腾","胡歌"]
x[0]="郭汉林"
print(x)
x[0],x[1]=x[1],x[0]
print(x)
#1、尾部追加元素——append方法
x.append("马云")
print('x.append("马云"):',x)
#2、指定位置插入元素——insert方法
x.insert(4,"张一鸣")
print('x.insert(4,"张一鸣"):',x)
#输出结果：
'''
['郭汉林', '马化腾', '胡歌']
['马化腾', '郭汉林', '胡歌']
x.append("马云"): ['马化腾', '郭汉林', '胡歌', '马云']
x.insert(4,"张一鸣"): ['马化腾', '郭汉林', '胡歌', '马云', '张一鸣']
'''
m =["马云","马化腾","胡歌","郭汉林","刘亦菲","张一鸣"]

#3、按索引删除元素——del命令
del m[2]
print('del m[2]:',m)
#4、按索引删除元素——pop方法  缺省索引参数时，pop默认删除最后一个元素
m.pop(-1)
print('m.pop(-1):',m)
#5、按值删除元素——remove方法   列表中包含多个待删除元素时，remove删除索引值相对较小的那个(s[0]='a',s[3]='a'会先删除s[0])
m.remove("刘亦菲")
print('m.remove("刘亦菲"):',m)
#输出结果：
'''
del m[2]: ['马云', '马化腾', '郭汉林', '刘亦菲', '张一鸣']
m.pop(-1): ['马云', '马化腾', '郭汉林', '刘亦菲']
m.remove("刘亦菲"): ['马云', '马化腾', '郭汉林']
'''
# (二)、常用操作 ：

#1、len函数 			len（列表）
#统计和返回指定列表的长度，即列表中元素的个数
boss =["马云","马化腾","胡歌","郭汉林","张一鸣"]
print("len(boss):",len(boss))
#2、in运算 和 not in运算		元素  in（not in）列表
#   用来判断指定的元素是否在列表中
print('in:',"胡歌" in boss)
print('not in:',"胡歌" not in boss)
#3、index方法			列表.index(元素)
#     用来在列表中查找指定的元素，如果找到返回第一个元素对应的索引；如果找不到，会直接报错。
print("boss.index('元素'):",boss.index("胡歌"))
#4、count方法			列表.count(元素)
#     用来统计并返回列表中指定元素的个数
print("boss.count('元素'):",boss.count("胡歌"))

#输出结果：
'''
len(boss): 5
in: True
not in: False
boss.index('元素'): 2
boss.count('元素'): 1
'''
# （三）、遍历列表
#  1、 使用range函数遍历列表。
leader =["马云","马化腾","胡歌","郭汉林","张一鸣"]
print('range(len(leader)):',range(len(leader)))  #修改range函数的参数,可以灵活访问列表的部分元素
print('range(3):',range(3))
for i in range(len(leader)):
    print(i,":",end='')
    print(leader[i])
# 输出结果：
'''
range(len(leader)): range(0, 5)
range(3): range(0, 3)
0 :马云
1 :马化腾
2 :胡歌
3 :郭汉林
4 :张一鸣
'''
#  2、直接的元素遍历。
gust =["马云","马化腾","胡歌","郭汉林","张一鸣"]
for i in gust :
    print(i)
# 输出结果：
'''
马云
马化腾
胡歌
郭汉林
张一鸣
'''

# (三)、列表排序：	
# 1、sort方法排序。  缺省参数的sort方法默认对列表元素按升序排序    嵌套结构的列表默认元素的第一个子元素为关键字按升序排序
age =[12,13,24,26]
age.sort
print(age)
'''
[12, 13, 24, 26]
'''
man = [[2,12],[4,26],[12,28],[3,18]]
man.sort()
print(man)
'''
[[2, 12], [3, 18], [4, 26], [12, 28]]
'''
# reverse参数为”True”时对列表元素按降序排序
age.sort(reverse=True)
print(age)
'''
[26, 24, 13, 12]
'''
man.sort(reverse=True)
print(man)
'''
[[12, 28], [4, 26], [3, 18], [2, 12]]
'''
# 2、sorted函数排序。 sorted命令的使用和参数含义和sort方法一致。但sorted命令生成新的有序列表，不改变原来的列表。

ls = [5,4,3,2,1]
lh = sorted(ls)
print('lh:',lh)
print(ls)
'''
lh: [1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
'''
ls = [[2,12],[4,26],[12,28],[3,18]]
lh = sorted(ls,reverse=True)
print('ls:',ls)
print('lh:',lh)
'''
ls: [[2, 12], [4, 26], [12, 28], [3, 18]]
lh: [[12, 28], [4, 26], [3, 18], [2, 12]]
'''
# 四、列表切片 列表[起始索引 ：终止索引 ：n]
# 字符串中关于索引和切片方式的规定都适用于列表切片。
gust =["马云","马化腾","胡歌","郭汉林","张一鸣"]
print('gust[0,1]',gust[0:1])  # 左闭右开
print('gust[-1:-3:-2]:',gust[-1:-3:-2]) # 反向寻找，间隔一个（步长为2）
'''
gust[0,1] ['马云']
gust[-1:-3:-2]: ['张一鸣']
'''
# 五、列表扩充
#1、  A+B  “+”运算将两个列表连接生成一个新列表，而不改变参与运算的列表本身。

boss =["马云","马化腾","胡歌","郭汉林","张一鸣"]
ls = [5,4,3,2,1]
print('boss+ls:',boss+ls)
'''
boss+ls: ['马云', '马化腾', '胡歌', '郭汉林', '张一鸣', 5, 4, 3, 2, 1]
'''
# 2、extend方法	，将参数列表添加至原列表中.
boss =["马云","马化腾","胡歌","郭汉林","张一鸣"]
ls = [5,4,3,2,1]
boss.extend(ls)
print("boss.extend(ls):",boss)
'''
boss.extend(ls): ['马云', '马化腾', '胡歌', '郭汉林', '张一鸣', 5, 4, 3, 2, 1]

'''
#  3、“*”运算	，通过重复指定遍数扩充列表长度,与“+”运算类似，“*”运算也生成新列表、而不改变参与运算的列表本身。

boss =["马云","马化腾","胡歌","郭汉林","张一鸣"]
bosses = boss*2
print('bosses:',bosses)
'''
bosses: ['马云', '马化腾', '胡歌', '郭汉林', '张一鸣', '马云', '马化腾', '胡歌', '郭汉林', '张一鸣']
'''
del boss[2]
print('boss:',boss)
print('bosses:',bosses)
'''
boss: ['马云', '马化腾', '郭汉林', '张一鸣']
bosses: ['马云', '马化腾', '胡歌', '郭汉林', '张一鸣', '马云', '马化腾', '胡歌', '郭汉林', '张一鸣']
'''
#  六、列表的清空：del bosses[:]、列表的删除:del bosses、Clear方法
del bosses[:]
print('type(bosses):',type(bosses))
'''
type(bosses): <class 'list'>
'''
del bosses
# print('bosses:',bosses)
# 报错： NameError: name 'bosses' is not defined
boss.clear()
print('boss:',boss)
'''
boss: []
'''
# 七、 数值列表
# 1、数值列表的创建
ls = input("请输入一个列表：\n")
print(ls)
print(type(ls))
'''
请输入一个列表：
1,2,3,4,5
1,2,3,4,5
<class 'str'>
请输入一个列表：
[1,2,3,4,5]
[1,2,3,4,5]
<class 'str'>
'''
# 说明：不管以何种形式输入,input函数都默认从键盘输入的是字符串。
ls = eval(input("请输入一个列表：\n"))
print(ls)
print(type(ls))
'''
请输入一个列表：
[1,2,3,4,5]
[1, 2, 3, 4, 5]
<class 'list'>
'''
#说明：eval函数能将带“[]”的输入转换为列表。

# 2、通过list函数转换	
r = range(1,3)
print("r:",r)
print(type(r))
'''
r: range(1, 3)
<class 'range'>
'''
ls = list(r)
print('ls:',ls)
print(type(ls))
'''
ls: [1, 2]
<class 'list'>
'''
# 例子：创建一个由1～10这十个数的平方值组成的数值列表
num =[]
for i in range(1,11) :
    num.append(i**2)
print('num:',num)
'''
num: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
'''
# 列表  =  [循环变量相关表达式 for 循环变量 in range函数] *****
# print('range[3]:',range[3]) 报错：TypeError: 'type' object is not subscriptable
ls1 = [x for x in range(3)]
print('ls1:',ls1)
ls2 = [x*2 for x in range(3)]
print('ls2:',ls2)
ls3 = [x for x in ls2 if x<4]
print('ls3:',ls3)
'''
ls1: [0, 1, 2]
ls2: [0, 2, 4]
ls3: [0, 2]
'''
# 列表嵌套
ln =[] #定义一个ln列表
for i in range(1,3) :   
    for j in range(1,4) :
        ln.append(i*j)  #ln使用前要先定义          
print('嵌套循环生成列表：',ln)
'''
嵌套循环生成列表： [1, 2, 3, 2, 4, 6]
'''
ln2=[i*j for i in range(1,3) for j in range(1,4)]
print("ln2:",ln2)
'''
ln2: [1, 2, 3, 2, 4, 6]
'''
# 用数字生成九九乘法表
for i in range(1,10):
    for j in  range(1,i+1):
        print(i,'*',j,'=',i*j," ",end='')
    print('')
'''
1 * 1 = 1  
2 * 1 = 2  2 * 2 = 4  
3 * 1 = 3  3 * 2 = 6  3 * 3 = 9  
4 * 1 = 4  4 * 2 = 8  4 * 3 = 12  4 * 4 = 16  
5 * 1 = 5  5 * 2 = 10  5 * 3 = 15  5 * 4 = 20  5 * 5 = 25  
6 * 1 = 6  6 * 2 = 12  6 * 3 = 18  6 * 4 = 24  6 * 5 = 30  6 * 6 = 36  
7 * 1 = 7  7 * 2 = 14  7 * 3 = 21  7 * 4 = 28  7 * 5 = 35  7 * 6 = 42  7 * 7 = 49  
8 * 1 = 8  8 * 2 = 16  8 * 3 = 24  8 * 4 = 32  8 * 5 = 40  8 * 6 = 48  8 * 7 = 56  8 * 8 = 64  
9 * 1 = 9  9 * 2 = 18  9 * 3 = 27  9 * 4 = 36  9 * 5 = 45  9 * 6 = 54  9 * 7 = 63  9 * 8 = 72  9 * 9 = 81
'''
# 用列表生成九九乘法表
#la = [i,"*",j,"=",i*j,('\n' if i==j else ' ')
 #     for i in range(1,10)  for j in range(1,i+1)]
la = [str(i) + '*' + str(j) + '=' + str(i*j) + ('\n' if i==j else ' ') 
                 for i in range(1,10)  for j in range(1,i+1)]
for x in la :
    print(x,end='')

